from dlgo import gotypes

COLS = "ABCDEFGHJKLMNOPQRST"
STONES_TO_CHAR = {
    None: ' · ',
    gotypes.Player.black: ' x ',
    gotypes.Player.white: ' o ',
}


def print_move(Player, Move):
    """输出一个玩家和某个行为
    :param Player: 玩家
    :param Move: 行为
    :return:
    """
    if Move.is_pass:
        move_str = 'pass'
    elif Move.is_resign:
        move_str = 'resign'
    else:
        # 语法：格式字符串 % (数据1, 数据2, ...)
        # 生成一个表示位置的字符串
        move_str = '%s%d' % (COLS[Move.point.col - 1], Move.point.row)
    print('%s : %s' % (Player, move_str))


def print_board(board):
    """输出棋盘
    :param board:
    :return:
    就是对每个位置进行遍历，看对应的位置属于什么，然后打印出来
    """
    for row in range(board.num_rows, 0, -1):
        # 这样规定是十位数的话就有两个格子，会比个位数多一格，所以个位数要多加个空格来对齐
        bump = ' ' if row <= 9 else ''
        line = []
        for col in range(1, board.num_cols + 1):
            # 得到这点是白棋黑棋还是没有棋，然后添加到这行的列表中
            stone = board.get(gotypes.Point(row=row, col=col))
            line.append(STONES_TO_CHAR[stone])
        # 打印这行
        print('%s%d %s' % (bump, row, ''.join(line)))
    # 打印最后的位置行
    print('    ' + '  '.join(COLS[:board.num_cols]))


def point_from_coords(coords):
    """从坐标字符串中获取点
    :param coords: 坐标字符串
    :return: 点
    """
    col = COLS.index(coords[0]) + 1
    row = int(coords[1:])
    return gotypes.Point(row=row, col=col)